#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/11/8 14:54
# @Author : youngchaolin

#  定义一个字典，记录登录状态
status_dict = {
    'username': None,
    'status': False
}

# register配置文件路径
# REGISTER_PATH = r'E:\pythonCode\python\python22期\day18\blog\conf\settings.py'
from conf import settings

# 三次登录验证函数，直接拿来用
# 登录成功，返回True，三次登录都验证失败，则返回False
def login_check():
    count = 1
    while count < 4:
        u = input("请输入用户名")
        p = input("请输入密码")
        # 读取文件，获取用户名和密码，保存到一个字典中
        with open(settings.REGISTER_PATH, mode='r', encoding='utf-8') as f:
            for line in f:
                # 读取文件后，密码会加一个\n换行符，需要使用strip去掉
                if u == line.split('|')[0].strip() and p == line.split('|')[1].strip():
                    print("登录成功")
                    status_dict['username'] = u
                    status_dict['status'] = True
                    return True
        # 能执行到这里，说明登录失败
        print('登录失败')
        # 提示剩余次数
        print("你还有%d次机会" % (3 - count))
        # 次数
        count += 1
    else:
        print("没机会了老哥")
        return False


# # 定义装饰器
# def auth(f):
#     def inner(*args, **kwargs):
#         # 访问函数之前的操作
#         # 访问被装饰函数之前，写一个三次登录认证的功能
#         # 登录成功，让其访问被装饰函数，登录没有成功，不让访问
#         if status_dict.get('status'):
#             ret = f(*args, **kwargs)
#             # 访问函数之后的操作
#             return ret
#         else:
#             # 登录
#             login_check()
#             if status_dict.get('status'):
#                 ret = f(*args, **kwargs)
#                 return ret
#             else:
#                 print('登录失败，请重新登录')
#
#     return inner


def login():
    login_check()


def register():
    username = ''
    password = ''
    while True:
        # 验证用户名
        username = input('请输入用户名[字母和数字组成]')
        if not username.isalnum():
            print('请输入正确格式的用户名')
        else:
            # 验证是否唯一，如果不唯一还需要迭代
            with open(settings.REGISTER_PATH, mode='rt', encoding='utf-8') as f:
                for line in f:
                    if username == line.split('|')[0].strip():
                        print('用户名已存在，请重试')
                        break
                else:
                    # 正常就结束外层循环
                    break

    while True:
        # 验证密码
        password = input('请输入6-14字符密码')
        if len(password) < 6 or len(password) > 14:
            print('请输入正确格式的密码')
        else:
            break
    # 写入文件'login.txt'
    with open(settings.REGISTER_PATH, mode='a', encoding='utf-8') as f:
        f.write(username + '|' + password + '\n')
        print(f'恭喜你{username},注册成功')

from lib import commons

@commons.auth
def article():
    print(f'欢迎{status_dict["username"]}进入文章页面')
    # 写入内容到文章
    while True:
        num = input('直接写入内容请输入1 导入md文件请输入2')
        if num.isdecimal() and (int(num) == 1 or int(num) == 2):
            # 获取字典里的方法，进行操作，不建议使用if-else这种写法
            article_operation_dic.get(int(num))()
            break
        else:
            print('输入操作方式有误')


# 写入文章方式1
def method1():
    article_name = input('请输入文章名字')
    article_naiyo = input('请输入文章内容')
    with open(article_name, mode='w', encoding='utf-8') as f:
        f.write(article_naiyo)
    print('发表文章成功')


# 写入文章方式2
def method2():
    path = input('请输入要导入的文件名[相对路径]')
    article_name = input('请输入文章名')
    with open(path, mode='r', encoding='utf-8') as f1, open(article_name, mode='a', encoding='utf-8') as f2:
        for line in f1:
            f2.write(line)
    print('发表文章成功')


article_operation_dic = {
    1: method1,
    2: method2
}


@commons.auth
def comment():
    print(f'欢迎{status_dict["username"]}进入评论页面')


@commons.auth
def dairy():
    print(f'欢迎{status_dict["username"]}进入日记页面')


@commons.auth
def collections():
    print(f'欢迎{status_dict["username"]}进入收藏页面')


def logout():
    # 清空登录状态字典
    status_dict['username'] = None
    status_dict['status'] = False
    print('注销成功')


def my_quit():
    quit()


# 可以直接调用，在调用之前，需要进行登录和注册验证的装饰
# article()
# # 只要前面一个成功了，后面的都可以访问
# comment()
# dairy()

dic = {
    1: login,
    2: register,
    3: article,
    4: comment,
    5: dairy,
    6: collections,
    7: logout,
    8: my_quit
}


def run():
    # 循环选择
    while True:
        print('''
        1.请登录
        2.请注册
        3.进入文章页面
        4.进入评论页面
        5.进入日记页面
        6.进入收藏页面
        7.注销账号
        8.退出整个程序
        ''')
        num = input('请选择操作方式')
        if num.isdecimal() and int(num) > 0 and int(num) < 9:
            # 获取字典里的方法，进行操作，不建议使用if-else这种写法
            dic.get(int(num))()
        else:
            print('输入操作方式有误')
